package com.xoa.plugin.workflow;

import com.xoa.model.workflow.FlowProcess;
import com.xoa.service.WFE.WFEFactory.WFEFlowProcess;
import com.xoa.util.SpringTool;
import com.xoa.util.ToJson;
import com.xoa.util.common.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

/**
 * @创建作者:李然 Lr
 * @方法描述：工作流转交保存时调用的插件，此类只有一个方法plugin
 * @创建时间：15:44 2019/5/10
 **/
@Service
public class WorkFlowPlugin {
    @Autowired
    private WFEFlowProcess wfeFlowProcess;

    /**
     * @创建作者:李然 Lr
     * @方法描述：工作流插件主方法，该方法只有一个参数type(0:保存.1:转交)，页面属性直接获取当前request域，所需参数可以从request中获取
     * @返回值为toJson,此方法为同步方法，只是起到动态调用当前步骤插件文件，具体插件内容有开发者自己决定，是否在自己的执行文件中使用线程也由开发者自己决定
     * @创建时间：15:46 2019/5/10
     **/
    public ToJson plugin(int type) {
        ToJson toJson = new ToJson(0, "没有插件可调用");
        try {
            HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
            //得到flowId 和 flowPrcs得到当前步骤属性
            String flowId = request.getParameter("flowId");
            String flowPrcs = null;
            //执行文件名
            String pluginClass = null;
            if (type == 0) {
                flowPrcs=request.getParameter("flowPrcs");
                if (!StringUtils.checkNull(flowPrcs)){
                    FlowProcess flowProcess = wfeFlowProcess.findbyprcsId(Integer.parseInt(flowId), Integer.parseInt(flowPrcs));
                    if(flowProcess!=null){
                        pluginClass = flowProcess.getPluginSave();
                    }
                }
            } else if (type == 1) {
                flowPrcs=request.getParameter("currentPrcsId");
                if (!StringUtils.checkNull(flowPrcs)){
                    FlowProcess flowProcess = wfeFlowProcess.findbyprcsId(Integer.parseInt(flowId), Integer.parseInt(flowPrcs));
                    if(flowProcess!=null){
                        pluginClass = flowProcess.getPlugin();
                    }
                }
            }
            if (pluginClass != null && pluginClass.length() > 0) {
                try {
                    Class clazz = Class.forName("com.xoa.plugin.workflow.workflowservice.imlp." + pluginClass);
                    Object o = clazz.newInstance();
                    Method method = clazz.getMethod("run", HttpServletRequest.class);
                    toJson = (ToJson) method.invoke(o, new Object[]{request});
                } catch (Exception e) {
                    toJson.setFlag(1);
                    toJson.setMsg("调用插件失败，出现异常，请检查！");
                    e.printStackTrace();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return toJson;
    }
}
